library(dplyr)
library(Seurat)
library(scater)
library(tibble)
sce <- readRDS('sce_jul_3.rds')
# seu <- CreateSeuratObject(counts=counts(sce), project = "EA3")
# seu <- NormalizeData(seu)
# seu <- FindVariableFeatures(seu, selection.method = "vst", nfeatures = 2000)
# plot1 <- VariableFeaturePlot(seu)
# plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
# CombinePlots(plots = list(plot1, plot2))
seu <- readRDS("seu_jun_21")
top10 <- head(VariableFeatures(seu), 10)
# all.genes <- rownames(seu)
# seu <- ScaleData(seu, features = all.genes)
# seu <- RunPCA(seu, features = VariableFeatures(object = seu))
VizDimLoadings(seu, dims = 1:2, reduction = "pca")

PCA
DimPlot(seu, reduction = "pca")

# seu <- JackStraw(seu, num.replicate = 100)
# seu <- ScoreJackStraw(seu, dims = 1:20)
JackStrawPlot(seu, dims = 1:20)
#> Warning: Removed 28473 rows containing missing values (geom_point).

ElbowPlot(seu)

head(Idents(seu), 5)
#> A01_EA1 A02_EA1 A03_EA1 A04_EA1 A05_EA1
#> 1 3 3 0 3
#> Levels: 0 1 2 3 4
UMAP
my_df <- data.frame(colData(sce)) %>% dplyr::mutate( somite_pairs = case_when(somitepairs == "19-20" ~ "20-22",
somitepairs == "20" ~ "20-22",
somitepairs == "20-21" ~ "20-22",
somitepairs == "21" ~ "20-22",
somitepairs == "21-22" ~ "20-22",
somitepairs == "22" ~ "20-22",
somitepairs == "22-23" ~ "23-25",
somitepairs == "23" ~ "23-25",
somitepairs == "23-24" ~ "23-25",
somitepairs == "24" ~ "23-25",
somitepairs == "24-25" ~ "23-25",
somitepairs == "25" ~ "23-25",
somitepairs == "25-26" ~ "26-27",
somitepairs == "26" ~ "26-27",
somitepairs == "27-28" ~ "26-27"))
seu@meta.data <- cbind(seu@meta.data,my_df[,c("genotype","phenotype", "somite_pairs")])
DimPlot(seu, reduction = "umap",cols = c("#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7"))

UMAP Geno Pheno
p1 <- DimPlot(seu, reduction = "umap", group.by = "genotype")
p2 <- DimPlot(seu, reduction = "umap", group.by = "phenotype")
p3 <- left_join(rownames_to_column(p1$data,"sample_id"),rownames_to_column(p2$data,"sample_id"), by = "sample_id") %>% dplyr::select(sample_id,UMAP_1.x,UMAP_2.x,genotype,phenotype) %>% dplyr::rename( UMAP_1 = UMAP_1.x , UMAP_2 = UMAP_2.x)
ggplot(p3,aes(UMAP_1,UMAP_2,colour = phenotype, shape = genotype, alpha=0.5)) + geom_point(size = 3) + theme_classic() + scale_colour_manual(values = c("#009E73","#F0E442", "#D55E00","#0072B2" )) + guides(alpha = FALSE)

UMAP
somite pairs
p1 <- DimPlot(seu, reduction = "umap", group.by = "genotype")
p2 <- DimPlot(seu, reduction = "umap", group.by = "somite_pairs")
p3 <- left_join(rownames_to_column(p1$data,"sample_id"),rownames_to_column(p2$data,"sample_id"), by = "sample_id") %>% dplyr::select(sample_id,UMAP_1.x,UMAP_2.x,genotype,somite_pairs) %>% dplyr::rename( UMAP_1 = UMAP_1.x , UMAP_2 = UMAP_2.x)
ggplot(p3,aes(UMAP_1,UMAP_2,colour = somite_pairs, shape = genotype, alpha=0.5)) + geom_point(size = 3) + theme_classic() + scale_colour_manual(values = c("#009E73","#F0E442", "#D55E00","#0072B2" )) + guides(alpha = FALSE)

Cluster 0 markers
cluster0.markers <- FindMarkers(seu, ident.1 = 0, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
VlnPlot(seu, features = rownames(cluster0.markers)[1:6] )

Cluster 1 markers
cluster0.markers <- FindMarkers(seu, ident.1 = 1, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
VlnPlot(seu, features = rownames(cluster0.markers)[1:6] )

Cluster 2 markers
cluster0.markers <- FindMarkers(seu, ident.1 = 2, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
VlnPlot(seu, features = rownames(cluster0.markers)[1:6] )

Cluster 3 markers
cluster0.markers <- FindMarkers(seu, ident.1 = 3, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
VlnPlot(seu, features = rownames(cluster0.markers)[1:6] )

Cluster 4 markers
cluster0.markers <- FindMarkers(seu, ident.1 = 4, logfc.threshold = 0.25, test.use = "roc", only.pos = TRUE)
VlnPlot(seu, features = rownames(cluster0.markers)[1:6] )

Top 2 from each cluster
FeaturePlot(seu, features = c("Adm", "Pde4b", "Gja4", "Gja5", "Gm13461", "Hspd1-ps3", "Gm5518", "Sumo2",
"Gpc3", "Nnat"))

Differential gene expression
Cluster 0 v 1
library(MAST)
library(DT)
cluster_0_prohsc_v_cluster_1_pro_hsc <- FindMarkers(seu, ident.1 = 0, ident.2 = 1 , test.use = "MAST")
datatable(cluster_0_prohsc_v_cluster_1_pro_hsc, extensions = 'Buttons', options = list (dom = 'Bfrtip', buttons = c('copy', 'csv', 'excel')))
ProHsc Cluster 0 v 1
library(MAST)
library(DT)
cluster_0_pro_hsc <- seu@meta.data %>% rownames_to_column("ID") %>% dplyr::filter(seurat_clusters == 0 & phenotype == "Pro-HSC")
cell_id_cluster_0_pro_hsc <- cluster_0_pro_hsc$ID
cluster_1_pro_hsc <- seu@meta.data %>% rownames_to_column("ID") %>% dplyr::filter(seurat_clusters == 1 & phenotype == "Pro-HSC")
cell_id_cluster_1_pro_hsc <- cluster_1_pro_hsc$ID
cluster_0_prohsc_v_cluster_1_pro_hsc <- FindMarkers(seu, ident.1 = cell_id_cluster_0_pro_hsc, ident.2 = cell_id_cluster_1_pro_hsc , test.use = "MAST")
datatable(cluster_0_prohsc_v_cluster_1_pro_hsc, extensions = 'Buttons', options = list(dom = 'Bfrtip', buttons = c('copy','csv','excel')))
Hemogenic endothelium Cluster 0 v 1
cluster_0_HE <- seu@meta.data %>% rownames_to_column("ID") %>% dplyr::filter(seurat_clusters == 0 & phenotype == "Hemogenic Endothelium")
cell_id_cluster_0_HE <- cluster_0_HE$ID
cluster_1_HE <- seu@meta.data %>% rownames_to_column("ID") %>% dplyr::filter(seurat_clusters == 1 & phenotype == "Hemogenic Endothelium")
cell_id_cluster_1_HE <- cluster_1_HE$ID
cluster_0_HE_v_cluster_1_HE <- FindMarkers(seu, ident.1 = cell_id_cluster_0_HE, ident.2 = cell_id_cluster_1_HE , test.use = "MAST")
datatable(cluster_0_HE_v_cluster_1_HE, extensions = 'Buttons', options = list (dom = 'Bfrtip', buttons = c('copy', 'csv', 'excel')))
LS0tCnRpdGxlOiAiQXp6b25pIGRhdGEgVkUtQ2FkKzIzR0ZQKyByZWNsYXNzaWZpZWQiCmF1dGhvcjogIkNoZWxhIEphbWVzIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIG1lc3NhZ2UgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFRSVUUsCiAgY29tbWVudCA9ICIjPiIsCiAgZmlnLndpZHRoPTEyLAogIGZpZy5oZWlnaHQ9OCwKICBmaWcuYWxpZ24gPSAiY2VudGVyIgopCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShzY2F0ZXIpCmxpYnJhcnkodGliYmxlKQoKc2NlIDwtIHJlYWRSRFMoJ3NjZV9qdWxfMy5yZHMnKQojIHNldSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzPWNvdW50cyhzY2UpLCBwcm9qZWN0ID0gIkVBMyIpCiMgc2V1IDwtIE5vcm1hbGl6ZURhdGEoc2V1KQojIHNldSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhzZXUsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBwbG90MSA8LSBWYXJpYWJsZUZlYXR1cmVQbG90KHNldSkKIyBwbG90MiA8LSBMYWJlbFBvaW50cyhwbG90ID0gcGxvdDEsIHBvaW50cyA9IHRvcDEwLCByZXBlbCA9IFRSVUUpCiMgQ29tYmluZVBsb3RzKHBsb3RzID0gbGlzdChwbG90MSwgcGxvdDIpKQpzZXUgPC0gcmVhZFJEUygic2V1X2p1bl8yMSIpCnRvcDEwIDwtIGhlYWQoVmFyaWFibGVGZWF0dXJlcyhzZXUpLCAxMCkKIyBhbGwuZ2VuZXMgPC0gcm93bmFtZXMoc2V1KQojIHNldSA8LSBTY2FsZURhdGEoc2V1LCBmZWF0dXJlcyA9IGFsbC5nZW5lcykKIyBzZXUgPC0gUnVuUENBKHNldSwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKG9iamVjdCA9IHNldSkpClZpekRpbUxvYWRpbmdzKHNldSwgZGltcyA9IDE6MiwgcmVkdWN0aW9uID0gInBjYSIpCmBgYAoKIyBQQ0EKCmBgYHtyfQpEaW1QbG90KHNldSwgcmVkdWN0aW9uID0gInBjYSIpCmBgYAoKYGBge3J9CiMgc2V1IDwtIEphY2tTdHJhdyhzZXUsIG51bS5yZXBsaWNhdGUgPSAxMDApCiMgc2V1IDwtIFNjb3JlSmFja1N0cmF3KHNldSwgZGltcyA9IDE6MjApCkphY2tTdHJhd1Bsb3Qoc2V1LCBkaW1zID0gMToyMCkKYGBgCgpgYGB7cn0KRWxib3dQbG90KHNldSkKYGBgCgpgYGB7cn0KaGVhZChJZGVudHMoc2V1KSwgNSkKYGBgCgojIFVNQVAKCmBgYHtyfQpteV9kZiA8LSBkYXRhLmZyYW1lKGNvbERhdGEoc2NlKSkgJT4lIGRwbHlyOjptdXRhdGUoIHNvbWl0ZV9wYWlycyA9IGNhc2Vfd2hlbihzb21pdGVwYWlycyA9PSAiMTktMjAiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjAiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjAtMjEiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjEiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjEtMjIiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjIiIH4gIjIwLTIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjItMjMiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjMiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjMtMjQiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjQiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjQtMjUiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjUiIH4gIjIzLTI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjUtMjYiIH4gIjI2LTI3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pdGVwYWlycyA9PSAiMjYiIH4gIjI2LTI3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29taXRlcGFpcnMgPT0gIjI3LTI4IiB+ICIyNi0yNyIpKQoKc2V1QG1ldGEuZGF0YSA8LSBjYmluZChzZXVAbWV0YS5kYXRhLG15X2RmWyxjKCJnZW5vdHlwZSIsInBoZW5vdHlwZSIsICJzb21pdGVfcGFpcnMiKV0pCkRpbVBsb3Qoc2V1LCByZWR1Y3Rpb24gPSAidW1hcCIsY29scyA9IGMoIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpKQpgYGAKCiMgVU1BUCBHZW5vIFBoZW5vCgpgYGB7cn0KcDEgPC0gRGltUGxvdChzZXUsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiZ2Vub3R5cGUiKQpwMiA8LSBEaW1QbG90KHNldSwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJwaGVub3R5cGUiKQpwMyA8LSBsZWZ0X2pvaW4ocm93bmFtZXNfdG9fY29sdW1uKHAxJGRhdGEsInNhbXBsZV9pZCIpLHJvd25hbWVzX3RvX2NvbHVtbihwMiRkYXRhLCJzYW1wbGVfaWQiKSwgYnkgPSAic2FtcGxlX2lkIikgJT4lIGRwbHlyOjpzZWxlY3Qoc2FtcGxlX2lkLFVNQVBfMS54LFVNQVBfMi54LGdlbm90eXBlLHBoZW5vdHlwZSkgJT4lIGRwbHlyOjpyZW5hbWUoIFVNQVBfMSA9IFVNQVBfMS54ICwgVU1BUF8yID0gVU1BUF8yLngpCgpnZ3Bsb3QocDMsYWVzKFVNQVBfMSxVTUFQXzIsY29sb3VyID0gcGhlbm90eXBlLCBzaGFwZSA9IGdlbm90eXBlLCBhbHBoYT0wLjUpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgdGhlbWVfY2xhc3NpYygpICsgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDA5RTczIiwiI0YwRTQ0MiIsICIjRDU1RTAwIiwiIzAwNzJCMiIgKSkgKyBndWlkZXMoYWxwaGEgPSBGQUxTRSkKCmBgYAoKIyBVTUFQCiMjIHNvbWl0ZSBwYWlycwoKYGBge3J9CnAxIDwtIERpbVBsb3Qoc2V1LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImdlbm90eXBlIikKcDIgPC0gRGltUGxvdChzZXUsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic29taXRlX3BhaXJzIikKcDMgPC0gbGVmdF9qb2luKHJvd25hbWVzX3RvX2NvbHVtbihwMSRkYXRhLCJzYW1wbGVfaWQiKSxyb3duYW1lc190b19jb2x1bW4ocDIkZGF0YSwic2FtcGxlX2lkIiksIGJ5ID0gInNhbXBsZV9pZCIpICU+JSBkcGx5cjo6c2VsZWN0KHNhbXBsZV9pZCxVTUFQXzEueCxVTUFQXzIueCxnZW5vdHlwZSxzb21pdGVfcGFpcnMpICU+JSBkcGx5cjo6cmVuYW1lKCBVTUFQXzEgPSBVTUFQXzEueCAsIFVNQVBfMiA9IFVNQVBfMi54KQoKZ2dwbG90KHAzLGFlcyhVTUFQXzEsVU1BUF8yLGNvbG91ciA9IHNvbWl0ZV9wYWlycywgc2hhcGUgPSBnZW5vdHlwZSwgYWxwaGE9MC41KSkgKyBnZW9tX3BvaW50KHNpemUgPSAzKSArIHRoZW1lX2NsYXNzaWMoKSArIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzAwOUU3MyIsIiNGMEU0NDIiLCAiI0Q1NUUwMCIsIiMwMDcyQjIiICkpICsgZ3VpZGVzKGFscGhhID0gRkFMU0UpCgpgYGAKCgojIENsdXN0ZXIgMCBtYXJrZXJzCgpgYGB7cn0KY2x1c3RlcjAubWFya2VycyA8LSBGaW5kTWFya2VycyhzZXUsIGlkZW50LjEgPSAwLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LCB0ZXN0LnVzZSA9ICJyb2MiLCBvbmx5LnBvcyA9IFRSVUUpClZsblBsb3Qoc2V1LCBmZWF0dXJlcyA9IHJvd25hbWVzKGNsdXN0ZXIwLm1hcmtlcnMpWzE6Nl0gKQpgYGAKCiMgQ2x1c3RlciAxIG1hcmtlcnMKCmBgYHtyfQpjbHVzdGVyMC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKHNldSwgaWRlbnQuMSA9IDEsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUsIHRlc3QudXNlID0gInJvYyIsIG9ubHkucG9zID0gVFJVRSkKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gcm93bmFtZXMoY2x1c3RlcjAubWFya2VycylbMTo2XSApCmBgYAoKIyBDbHVzdGVyIDIgbWFya2VycwoKYGBge3J9CmNsdXN0ZXIwLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMoc2V1LCBpZGVudC4xID0gMiwgbG9nZmMudGhyZXNob2xkID0gMC4yNSwgdGVzdC51c2UgPSAicm9jIiwgb25seS5wb3MgPSBUUlVFKQpWbG5QbG90KHNldSwgZmVhdHVyZXMgPSByb3duYW1lcyhjbHVzdGVyMC5tYXJrZXJzKVsxOjZdICkKYGBgCgojIENsdXN0ZXIgMyBtYXJrZXJzCgpgYGB7cn0KY2x1c3RlcjAubWFya2VycyA8LSBGaW5kTWFya2VycyhzZXUsIGlkZW50LjEgPSAzLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LCB0ZXN0LnVzZSA9ICJyb2MiLCBvbmx5LnBvcyA9IFRSVUUpClZsblBsb3Qoc2V1LCBmZWF0dXJlcyA9IHJvd25hbWVzKGNsdXN0ZXIwLm1hcmtlcnMpWzE6Nl0gKQpgYGAKCiMgQ2x1c3RlciA0IG1hcmtlcnMKCmBgYHtyfQpjbHVzdGVyMC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKHNldSwgaWRlbnQuMSA9IDQsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUsIHRlc3QudXNlID0gInJvYyIsIG9ubHkucG9zID0gVFJVRSkKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gcm93bmFtZXMoY2x1c3RlcjAubWFya2VycylbMTo2XSApCmBgYAoKIyBUb3AgMiBmcm9tIGVhY2ggY2x1c3RlcgoKYGBge3J9CkZlYXR1cmVQbG90KHNldSwgZmVhdHVyZXMgPSBjKCJBZG0iLCAiUGRlNGIiLCAiR2phNCIsICJHamE1IiwgIkdtMTM0NjEiLCAiSHNwZDEtcHMzIiwgIkdtNTUxOCIsICJTdW1vMiIsIAogICAgIkdwYzMiLCAiTm5hdCIpKQpgYGAKCiMgRGlmZmVyZW50aWFsIGdlbmUgZXhwcmVzc2lvbgojIyBDbHVzdGVyIDAgdiAxCgpgYGB7cn0KbGlicmFyeShNQVNUKQpsaWJyYXJ5KERUKQoKY2x1c3Rlcl8wX3Byb2hzY192X2NsdXN0ZXJfMV9wcm9faHNjIDwtIEZpbmRNYXJrZXJzKHNldSwgaWRlbnQuMSA9IDAsIGlkZW50LjIgPSAxICwgdGVzdC51c2UgPSAiTUFTVCIpCgpkYXRhdGFibGUoY2x1c3Rlcl8wX3Byb2hzY192X2NsdXN0ZXJfMV9wcm9faHNjLCAgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3QgKGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnKSkpCgpgYGAKCiMjIFByb0hzYyBDbHVzdGVyIDAgdiAxCgpgYGB7cn0KbGlicmFyeShNQVNUKQpsaWJyYXJ5KERUKQpjbHVzdGVyXzBfcHJvX2hzYyA8LSBzZXVAbWV0YS5kYXRhICU+JSByb3duYW1lc190b19jb2x1bW4oIklEIikgJT4lIGRwbHlyOjpmaWx0ZXIoc2V1cmF0X2NsdXN0ZXJzID09IDAgJiBwaGVub3R5cGUgPT0gIlByby1IU0MiKQpjZWxsX2lkX2NsdXN0ZXJfMF9wcm9faHNjIDwtIGNsdXN0ZXJfMF9wcm9faHNjJElECmNsdXN0ZXJfMV9wcm9faHNjIDwtIHNldUBtZXRhLmRhdGEgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigiSUQiKSAlPiUgZHBseXI6OmZpbHRlcihzZXVyYXRfY2x1c3RlcnMgPT0gMSAmIHBoZW5vdHlwZSA9PSAiUHJvLUhTQyIpIApjZWxsX2lkX2NsdXN0ZXJfMV9wcm9faHNjIDwtIGNsdXN0ZXJfMV9wcm9faHNjJElECgpjbHVzdGVyXzBfcHJvaHNjX3ZfY2x1c3Rlcl8xX3Byb19oc2MgPC0gRmluZE1hcmtlcnMoc2V1LCBpZGVudC4xID0gY2VsbF9pZF9jbHVzdGVyXzBfcHJvX2hzYywgaWRlbnQuMiA9IGNlbGxfaWRfY2x1c3Rlcl8xX3Byb19oc2MgLCB0ZXN0LnVzZSA9ICJNQVNUIikKCmRhdGF0YWJsZShjbHVzdGVyXzBfcHJvaHNjX3ZfY2x1c3Rlcl8xX3Byb19oc2MsIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gYygnY29weScsJ2NzdicsJ2V4Y2VsJykpKQoKYGBgCgojIyBIZW1vZ2VuaWMgZW5kb3RoZWxpdW0gQ2x1c3RlciAwIHYgMQoKYGBge3J9CmNsdXN0ZXJfMF9IRSA8LSBzZXVAbWV0YS5kYXRhICU+JSByb3duYW1lc190b19jb2x1bW4oIklEIikgJT4lIGRwbHlyOjpmaWx0ZXIoc2V1cmF0X2NsdXN0ZXJzID09IDAgJiBwaGVub3R5cGUgPT0gIkhlbW9nZW5pYyBFbmRvdGhlbGl1bSIpCmNlbGxfaWRfY2x1c3Rlcl8wX0hFIDwtIGNsdXN0ZXJfMF9IRSRJRApjbHVzdGVyXzFfSEUgPC0gc2V1QG1ldGEuZGF0YSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJJRCIpICU+JSBkcGx5cjo6ZmlsdGVyKHNldXJhdF9jbHVzdGVycyA9PSAxICYgcGhlbm90eXBlID09ICJIZW1vZ2VuaWMgRW5kb3RoZWxpdW0iKSAKY2VsbF9pZF9jbHVzdGVyXzFfSEUgPC0gY2x1c3Rlcl8xX0hFJElECgpjbHVzdGVyXzBfSEVfdl9jbHVzdGVyXzFfSEUgPC0gRmluZE1hcmtlcnMoc2V1LCBpZGVudC4xID0gY2VsbF9pZF9jbHVzdGVyXzBfSEUsIGlkZW50LjIgPSBjZWxsX2lkX2NsdXN0ZXJfMV9IRSAsIHRlc3QudXNlID0gIk1BU1QiKQoKZGF0YXRhYmxlKGNsdXN0ZXJfMF9IRV92X2NsdXN0ZXJfMV9IRSwgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3QgKGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnKSkpCmBgYAoKCg==